/**
 * js base64加密
 */
class Encryption {
  // constructor(info) {
  //   // this.info = info;
  // }

  // eslint-disable-next-line class-methods-use-this
  base64EncodeChars() {
    // 数据
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  }

  // eslint-disable-next-line class-methods-use-this
  base64DecodeChars() {
    // 数据
    // console.log(this.info);
    // eslint-disable-next-line no-array-constructor
    const data = new Array(
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      62,
      -1,
      -1,
      -1,
      63,
      52,
      53,
      54,
      55,
      56,
      57,
      58,
      59,
      60,
      61,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15,
      16,
      17,
      18,
      19,
      20,
      21,
      22,
      23,
      24,
      25,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      26,
      27,
      28,
      29,
      30,
      31,
      32,
      33,
      34,
      35,
      36,
      37,
      38,
      39,
      40,
      41,
      42,
      43,
      44,
      45,
      46,
      47,
      48,
      49,
      50,
      51,
      -1,
      -1,
      -1,
      -1,
      -1,
    );
    return data;
  }

  // 加密
  base64encode(str) {
    // console.log(this.classMethod());
    let out = null;
    let i = null;
    let len = null;
    let c1 = null;
    let c2 = null;
    let c3 = null;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
      // eslint-disable-next-line no-bitwise
      c1 = str.charCodeAt(i++) & 0xff;
      if (i == len) {
        out += this.base64EncodeChars().charAt(c1 >> 2);
        out += this.base64EncodeChars().charAt((c1 & 0x3) << 4);
        out += "==";
        break;
      }
      c2 = str.charCodeAt(i++);
      if (i == len) {
        out += this.base64EncodeChars().charAt(c1 >> 2);
        out += this.base64EncodeChars().charAt(
          ((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4),
        );
        out += this.base64EncodeChars().charAt((c2 & 0xf) << 2);
        out += "=";
        break;
      }
      c3 = str.charCodeAt(i++);
      out += this.base64EncodeChars().charAt(c1 >> 2);
      out += this.base64EncodeChars().charAt(
        ((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4),
      );
      out += this.base64EncodeChars().charAt(
        ((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6),
      );
      out += this.base64EncodeChars().charAt(c3 & 0x3f);
    }
    return out;
  }

  // 解密方法
  base64decode(str) {
    let c1 = null;
    let c2 = null;
    let c3 = null;
    let c4 = null;
    let i = null;
    let len = null;
    let out = null;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
      /* c1 */
      do {
        c1 = this.base64DecodeChars()[str.charCodeAt(i++) & 0xff];
      } while (i < len && c1 == -1);
      if (c1 == -1) break;
      /* c2 */
      do {
        c2 = this.base64DecodeChars()[str.charCodeAt(i++) & 0xff];
      } while (i < len && c2 == -1);
      if (c2 == -1) break;
      out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
      /* c3 */
      do {
        c3 = str.charCodeAt(i++) & 0xff;
        if (c3 == 61) return out;
        c3 = this.base64DecodeChars()[c3];
      } while (i < len && c3 == -1);
      if (c3 == -1) break;
      out += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2));
      /* c4 */
      do {
        c4 = str.charCodeAt(i++) & 0xff;
        if (c4 == 61) return out;
        c4 = this.base64DecodeChars()[c4];
      } while (i < len && c4 == -1);
      if (c4 == -1) break;
      out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
  }
}

export default Encryption;
